题目
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
思路
对于链表的题目,首先可以考虑一下是不是需要用到 dummy 哑节点,用了哑节点之后题目会不会好做一点。 或者,考虑一下 curr工作指针。这都是思路的来源。
其次,链表的题目跟树的题目一样,都有一个 指向另一个节点的指针。所以我们想一想题目是不是可以通过递归去做。这样避免了使用迭代的方式,减少自己的思考难度。
对于本道题,合并两个有序列表。可以用递归,然后是使用自顶而下的递归呢,还是自底而上的递归呢?
- 需要进行分析,设置一个 curr工作节点,让这个工作节点指向当前两个链表头较大的那一个。
- 然后再去递归
- 最后返回值为工作节点
Java 代码
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode curr;
if(l1 == null) return l2;
if(l2 == null) return l1;
if(l1.val < l2.val){
curr = l1;
curr.next = mergeTwoLists(l1.next, l2);
}else{
curr = l2;
curr.next = mergeTwoLists(l1, l2.next);
}
return curr;
}
}
这应该算是 自顶而下 的递归解决思路吧
补充:非递归实现
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode dummy = new ListNode(0);
ListNode curr = dummy;
while(l1 !=null && l2 != null){
if(l1.val < l2.val){
curr.next = l1;
l1 = l1.next;
}
else{
curr.next = l2;
l2 = l2.next;
}
curr = curr.next;
}
if(l1 == null)
curr.next = l2;
else if(l2 == null)
curr.next = l1;
return dummy.next;
}
}