java 合并两个有序链表_合并两个有序的单链表 java

前面的文章写了合并两个有序的数组,然后想着顺便写一下合并两个有序的单链表。增加自己对这些数据结构操作的熟练度,让自己有更清晰的认识。

先上代码:

public class TwoListToOne {

public static void main(String[] args) {

Node n7 = new Node(7, null);

Node n5 = new Node(5, n7);

Node n3 = new Node(3, n5);

Node root1 = new Node(1, n3);

Node n8 = new Node(8, null);

Node n6 = new Node(6, n8);

Node n4 = new Node(4, n6);

Node root2 = new Node(2, n4);

Node result = twoListToOne2(root1, root2);

while (result != null) {// 遍历的时候写得太快了,写成了result.next,后面发现输出不对,看着代码也没问题,忽然发现遍历错了,尴尬

System.out.println(result.value);

result = result.next;

}

}

private static Node twoListToOne2(Node root1, Node root2) {

if (root1 == null) {

return root2;

}

if (root2 == null) {

return root1;

}

Node temp = new Node(0, null);

Node result = temp;

while (root1 != null && root2 != null) {// 遍历到最后退出

if (root1.value <= root2.value) {

temp.next = root1;

root1 = root1.next;

} else {

temp.next = root2;

root2 = root2.next;

}

temp = temp.next;

}

if (root1 == null) {// 由于是链表,所以直接指向即可

temp.next = root2;

}

if (root2 == null) {

temp.next = root1;

}

return result.next;// 第一个节点是初始化时附加的0,所以去掉

}

}

class Node {

int value;

Node next;

public Node(int value, Node next) {

this.value = value;

this.next = next;

}

}

输出:

1

2

3

4

5

6

7

8

一切都很ok。

这里要注意的是对输出的链表为空的情况的判断,不然直接代入程序会报空指针异常。

然后整体思路和合并两个有序数组时差不多,注意好循环结束条件的书写。

通过这题可以很好地提高自己对单链表操作的熟练度。

《剑指offer》上是用递归写的,也就是每次递归获得一个节点。但是我觉得这样递归下去栈的深度会太高,所以我就按照自己的思路直接写了。

欢迎交流和讨论。

以下是一个Java的示例代码,用于合并两个有序链表: ```java class ListNode { int val; ListNode next; ListNode(int val) { this.val = val; } } public class MergeTwoSortedLists { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode dummy = new ListNode(0); ListNode current = dummy; while (l1 != null && l2 != null) { if (l1.val < l2.val) { current.next = l1; l1 = l1.next; } else { current.next = l2; l2 = l2.next; } current = current.next; } if (l1 != null) { current.next = l1; } if (l2 != null) { current.next = l2; } return dummy.next; } } ``` 这个代码中,我们定义了一个`ListNode`类来表示链表节点,每个节点都有一个整数值`val`和一个指向下一个节点的指针`next`。然后,我们创建了一个名为`MergeTwoSortedLists`的类,其中包含了一个`mergeTwoLists`方法,用于合并两个有序链表。我们使用了一个虚拟节点`dummy`来简化代码逻辑。 在`mergeTwoLists`方法中,我们使用两个指针`l1`和`l2`分别指向两个链表的头节点,然后我们比较两个节点的值,将较小的节点链接到结果链表中,并将对应的指针向后移动一位。重复这个过程,直到其中一个链表遍历完。最后,我们将剩余未遍历完的链表直接链接到结果链表的末尾。 最后,我们返回虚拟节点`dummy`的下一个节点作为合并后的链表头节点。 请注意,这只是一个示例代码,你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值