前面的文章写了合并两个有序的数组,然后想着顺便写一下合并两个有序的单链表。增加自己对这些数据结构操作的熟练度,让自己有更清晰的认识。
先上代码:
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》上是用递归写的,也就是每次递归获得一个节点。但是我觉得这样递归下去栈的深度会太高,所以我就按照自己的思路直接写了。
欢迎交流和讨论。