合并两个有序链表(递归)

欧阳子遥 学生  2020-09-29 11:58:49
这是合并两个有序链表的递归代码。迭代会写,递归写不对。
这是LeetCode的官方的解答。问题:
后面两个else if为什么要把return写在里面,还有l1.next = mergeTwoLists(l1.next, l2);中为什么是l1.next?
它if中不是l1.val吗?这个代码是怎么处理一个链表比较完了,另一个链表还没有比较完呢?
请指教


class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
if (l1 == null) {
return l2;
} else if (l2 == null) {
return l1;
} else if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}

}
}
...全文
1263 点赞 收藏 3
写回复
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
KeepSayingNo 2020-09-30
链表的作用就是后一个节点存了前一个节点的地址信息,用前一个节点的next指向后一个节点,就能合并链表
回复
qq_39936465 2020-09-30
引用 楼主 欧阳子遥 的回复:
这是合并两个有序链表的递归代码。迭代会写,递归写不对。 这是LeetCode的官方的解答。问题: 后面两个else if为什么要把return写在里面,还有l1.next = mergeTwoLists(l1.next, l2);中为什么是l1.next? 它if中不是l1.val吗?这个代码是怎么处理一个链表比较完了,另一个链表还没有比较完呢? 请指教

class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) {
            return l2;
        } else if (l2 == null) {
            return l1;
        } else if (l1.val < l2.val) {
            l1.next = mergeTwoLists(l1.next, l2);
            return l1;
        } else {
            l2.next = mergeTwoLists(l1, l2.next);
            return l2;
        }

    }
}
你没理解程序的作用, l1.val < l2.val是比较当前2个链表的当前节点值的大小,如果l1小则不变,比较节点移动到l1.next与l2的当前节点比较,如果l2小则把l2整段链接l1.next后面,再比较l2.next和l1当前节点的大小。.
回复
qybao 2020-09-30
这有什么难理解的 如果l1当前节点小于l2当前节点(l1.val<l2.val),就保留l1点前节点,然后用l1的下一个节点开始的集合和l2做合并,合并好的结果保存到l1的下一个节点(l1.next=mergeTowLists),这样即能保证小的节点排在前面(保留l1当前小的节点),又能保证节点能串接在一起成为个大集合(l1的下一个节点指向排序合并好的集合) 反之,l2.val<l1.val也一样,先保留l2当前节点,然后用l2的下一个节点开始的集合和l1合并,合并结果保存到l2的下一个节点。
回复
发动态
发帖子
Java SE
创建于2007-09-28

6.1w+

社区成员

Java 2 Standard Edition
申请成为版主
社区公告
暂无公告