当前位置:   article > 正文

两个升序有序Java_【Java面试题】——— 合并两个有序链表(递归法、迭代法)...

java 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两

题目描述:

将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:

输入:1->2->4, 1->3->4

输出:1->1->2->3->4->4

方法一:迭代法

比较两个链表的头结点,将较小的节点作为合并后的新链表的头结点

初始状态:

dcfb1d9c2a92deb650de2131cc005736.png

第一次合并:

5fb6a98fa04f91083d45ba94dc685847.png

第二次合并:

36c01e9fffed1a016d9f119fbc196757.png

第三次合并:

2b209c16e205e3f146bb57ba40f7ca87.png

第四次合并:

7cec4db1520d16620b26eaa306892389.png

代码实现:

class ListNode{

int val;

ListNode next;

public ListNode(int x){

x=val;

}

}

public class MergeOrderLinkedList {

public ListNode method1(ListNode l1,ListNode l2){

//new一个新的链表

//在返回节点之前维护对节点的不变引用。

ListNode res = new ListNode(-1);

ListNode prev = res;

//结束的条件是其中一个链表为空

while (l1!=null && l2!=null) {

//比较两个链表的头结点,较小的作为新链表的头结点

if (l1.val <= l2.val) {

prev.next = l1;

//将指针后移一位

l1 = l1.next;

}else{

prev.next = l2;

l2 = l2.next;

}

//新链表的指针也要向后移动一位

prev = prev.next;

}

//最后一步:当某个链表为空时,将另一个不为空的链表加入到新链表中

prev.next = l1 == null ? l2 : l1;

//返回新链表

return res.next;

}

}

方法二:递归

递推公式:

1c40ebc1ccd047bf0ea77dd20a394d19.png

也就是说,比较两个链表的头结点,将头结点较小的那个链表的剩余部分,与另一个链表进行递归合并。

5b6db6c5b1461c2b436e3bc415d97d0a.png

452e9bbccc1b95d85598e7b65ccb2037.png

cc3be20b874dbc18e21ccf7515ef6c41.png

6fab65df03653705851a6d4783dffcc2.png

79f6b8cfb944f22e807b8c4229acca2b.png

9a99b3bbcf6b45d74dcee3b11db31513.png

9be9d65d5134fe1436c313712846f979.png 6bb60b96759328e8628627046f6216ab.png

public ListNode method2(ListNode l1,ListNode l2){

//如果某一个链表为空,返回另一个不为空的链表

if(l1==null){

return l2;

}

if(l2==null){

return l1;

}

if(l1.val<=l2.val){

//如果list1的头结点小于list的头结点,递归 合并list1剩余的部分和list2

l1.next = method2(l1.next,l2);

return l1;

}else {

l2.next = method2(l2.next, l1);

return l2;

}

}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/数据可视化灵魂/article/detail/62911
推荐阅读
相关标签
  

闽ICP备14008679号