链表常见问题:有序合并

本文介绍了一种将两个已排序的链表合并为一个新排序链表的算法。通过比较两个链表头部节点的值,选择较小者进行连接,直至其中一个链表耗尽,再将另一个链表的剩余部分附加到结果链表的末尾。文章提供了完整的Java实现代码及运行结果。
摘要由CSDN通过智能技术生成

一 有序合并问题

两个有序链表,合并后仍然有序。

分析: 容易想到的就是找头,也就是判断下两个链表头结点val小的。然后采用尾部插入(从head插就覆盖了),遍历两个链表,每次取小的,知道有个链表为空退出。在判断有无剩余非空的链表,追加到尾部。

/**
 * 
 * @author bohu83
 *
 */
public class MergerList {

	public static void main(String[] args) {

		Node node1 = new Node(1);

		node1.next = new Node(3);
		node1.next.next = new Node(5);
		node1.next.next.next = new Node(7);
		node1.next.next.next = new Node(9);

		Node node6 = new Node(2);
		node6.next = new Node(4);
		node6.next.next = new Node(5);
		node6.next.next.next = new Node(8);

		Node rstNode1 = mergeListNode(node1, node6);
		while (rstNode1 != null) {
			System.out.print("->" + rstNode1.val);
			rstNode1 = rstNode1.next;
		}

	}

	// list合并
	public static Node mergeListNode(Node list1, Node list2) {
		// conner case
		if (list1 == null) {
			return list2;
		}
		if (list2 == null) {
			return list1;
		}
		Node res = null;
		Node lastNode = null;// 记录结果链表的最后一个结点
		Node curA = list1;
		Node curB = list2;
		while (curA != null && curB != null) {
			// find head
			if (curA.val <= curB.val) {
				if (res == null) {
					res = curA;
				} else {
					lastNode.next = curA;
				}
				lastNode = curA;
				curA = curA.next;
			} else {
				if (res == null) {
					res = curB;
				} else {
					lastNode.next = curB;
				}
				lastNode = curB;
				curB = curB.next;
			}

		}

		// 剩余插入尾
		if (curA != null) {
			lastNode.next = curA;
		} else {
			lastNode.next = curB;
		}
		return res;
	}

	static class Node {
		int val;
		Node next;

		Node(int x) {
			val = x;
		}
	}

}

->1->2->3->4->5->5->8->9 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值