题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
比如:
1 2
| 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4]
|
1 2
| 输入:l1 = [], l2 = [] 输出:[]
|
1 2
| 输入:l1 = [], l2 = [0] 输出:[0]
|
提示:
- 两个链表的节点数目范围是
[0, 50]
-100 <= Node.val <= 100
l1
和 l2
均按 非递减顺序 排列
题解
遍历
遍历两个链表,比较当前两个节点的大小,取其中较小的节点,然后后移该节点指针,直到其中一个节点遍历结束,将有剩余节点的链表拼接到后面。
1 2 3 4 5 6 7 8
| class ListNode { var val: Int var next: ListNode? init(_ val: Int) { self.val = val self.next = nil } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| func mergeTwoLists(_ list1: ListNode?, _ list2: ListNode?) -> ListNode? { if list1 == nil { return list2 } if list2 == nil { return list1 } let head = ListNode(0) var cur = head var l1 = list1 var l2 = list2 while l1 !== nil && l2 !== nil { let val1 = l1!.val let val2 = l2!.val if val1 <= val2 { cur.next = l1 l1 = l1?.next } else { cur.next = l2 l2 = l2?.next } cur = cur.next! } if l1 !== nil { cur.next = l1 } else if l2 !== nil { cur.next = l2 } return head.next }
|
递归法
合并两个链表时,每当我们添加完一个节点后,该节点指针后移,相当于这个链表剩余部分与另一个链表剩余部分合并,两个链表剩余部分合并就是原问题两个有序链表合并的子问题。
- 每次比较两个链表当前结点的值,然后取较小值的链表指针往后,另一个不变送入递归中。
- 递归回来的结果我们要加在当前较小值的结点后面,相当于不断在较小值后面添加结点。
- 递归的终止是两个链表为空。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| func mergeTwoLists(_ list1: ListNode?, _ list2: ListNode?) -> ListNode? { if list1 == nil { return list2 } if list2 == nil { return list1 } let value1 = list1!.val let value2 = list2!.val if value1 <= value2 { list1?.next = mergeTwoLists(list1?.next, list2) return list1 } else { list2?.next = mergeTwoLists(list1, list2?.next) return list2 } }
|