合并两个排好序的单链表

//链表的结构
class LinkedList {
	int data;
	LinkedList next;
}
/**
 * 
 * 合并两个排好序的链表
 *
 */
public class UnionLinkList {
	/**
	 * 建立单链表
	 * @param head  单链表头结点
	 */
	public void createLinkedList(LinkedList head) {
		LinkedList cur = head;
		Scanner scanner = new Scanner(System.in);
		String data;
		System.out.println("输入单链表结点的值,输入#结束");
		while (true) {
			data = scanner.next();
			if (data.equals("#")) {
				cur.next = null;
				break;
			}
			LinkedList node = new LinkedList();
			node.data = Integer.valueOf(data);
			cur.next = node;
			cur = cur.next;
		}
	}
	/**
	 * 
	 * @param a                 链表a
	 * @param b	            链表b
	 * @param union	            合并后的链表
	 * @return		    合并后的链表
	 */
	public LinkedList union(LinkedList a,LinkedList b,LinkedList union){
		LinkedList pc = union = a;
		LinkedList pa = a.next;
		LinkedList pb = b.next;
		while(pa != null && pb != null){
			if(pa.data < pb.data){
				pc.next = pa;
				pc = pa;
				pa = pa.next;
			}else{
				pc.next = pb;
				pc = pb;
				pb = pb.next;				
			}
			if(pa != null){
				pc.next = pa;
			}
			if(pb != null){
				pc.next = pb;
			}
		}
		return union;
	}
	/**
	 * 打印单链表
	 * @param head   链表头指针
	 */
	public void printLinkList(LinkedList head){
		if(head == null || head.next == null){
			return;
		}
		head = head.next;
		while(head != null){
			System.out.print(head.data+" ");
			head = head.next;
		}
		System.out.println();
	}
	public static void main(String[] args) {
		UnionLinkList ull = new UnionLinkList();
		LinkedList pa = new LinkedList();
		LinkedList pb = new LinkedList();
		ull.createLinkedList(pa);
		ull.createLinkedList(pb);
		LinkedList union = null;
		union = ull.union(pa,pb, union);
		ull.printLinkList(union);
	}
}


在C语言中,尾部插入法通常用于创建新节点并将其添加到已排序的链表的末尾,以便保持链表的有序性。合并两个已排序的链表并保持有序的过程可以分为以下几个步骤: 1. 定义链表节点结构: ```c typedef struct ListNode { int data; struct ListNode* next; } ListNode; ``` 2. 分别创建头指针指向两个已经排好序链表的首节点: ```c ListNode* list1_head = ...; // 第一个链表的头指针 ListNode* list2_head = ...; // 第二个链表的头指针 ``` 3. 创建一个新的链表头指针 `merged_head` 和临时指针 `temp`: ```c ListNode* merged_head = NULL; ListNode* temp = NULL; ``` 4. 使用循环遍历两个链表,分别处理空列表、第一个链表结束以及第二个链表有剩余的情况: - 如果第一个链表为空,直接将第二个链表接到新链表上。 - 否则,如果第二个链表为空,或者第一个链表的当前节点值小于等于第二个链表的当前节点值,将第一个链表的当前节点加入到新链表,并移动指针。 - 否则,将第二个链表的当前节点加入到新链表,并移动指针。 5. 当遍历完其中一个链表时,将另一个链表剩余的部分连接到新链表的末尾。 6. 最后返回合并后的链表头 `merged_head`。 合并示例代码片段: ```c while (list1_head && list2_head) { if (list1_head->data <= list2_head->data) { temp = list1_head; list1_head = list1_head->next; } else { temp = list2_head; list2_head = list2_head->next; } temp->next = merged_head; merged_head = temp; } // 将剩余的链表(如果有的话)连接到新链表末尾 if (list1_head) { temp->next = list1_head; } else { temp->next = list2_head; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值