您的位置:首页 > 编程语言 > Java开发

合并两个有序单链表(Java)

2017-10-23 13:22 295 查看

思想:

准备两个链表l1和l2:

判断是否有链表为空:如果l1为空,则不用比较直接返回l2,如果l1为空,则直接返回l2;

比较l1和l2节点,选出最小的那个节点,将该节点设为合并后的链表的head(头)节点,同时将指向该节点的l1或l2后移,方便接下来的比较;

设置一个变量temp指向head节点,用于之后连接其它节点;

再比较l1和l2节点,同样选出小的那个节点,将该节点设为合并后的链表的第二个节点,用temp.next表示该节点,同时将指向该节点的l1或l2后移;

重复比较l1和l2节点,直到l1或l2节点为null;

此时,必定有一个链表中的所有节点都放入了新链表中,只要将另一个链表中的剩余的所有节点都接到新链表之后就可以了。

1.单链表的节点的结构:

public class ListNode {
int val;//节点的属性,存储节点的值
ListNode next;//节点的属性,存储了下一个节点的地址
ListNode(int x) { val = x; }
}


2.合并链表的方法:

class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode head = null;
if (l1 == null) {
return l2;
}
if (l2 == null) {
return l1;
}
if (l1.val <= l2.val) {//如果l1节点的值小于等于l2节点的值,由于这两个链表是有序的,所以合并后最小的节点(head节点)就是它们两者中的小者
head = l1;
l1 = l1.next;//后移,用于继续比较选出接下来最小的节点
}else {
head = l2;
l2 = l2.next;
}
ListNode temp = head;
//接着比较两个链表,对两个链表中的最小的节点进行比较选出最小的,也就是合并后的第二小的节点,循环知道有一个链表为空
while (l1 != null && l2 != null) {
if (l1.val <= l2.val) {
temp.next = l1;
l1 = l1.next;
}else {
temp.next = l2;
l2 = l2.next;
}
temp = temp.next;
}
if (l1 == null) {
temp.next = l2;
}
if (l2 == null) {
temp.next = l1;
}
return head;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  单链表 合并 链表 java