笔试题四:带头节点head两个链表合并,并且有序

原创 2013年12月04日 11:09:53

将2个分别有序的链表合并成一个链表,并且合并后的链表依然有序。


方法:初始化一个头结点head,然后比较list1,和list2链表的第一个节点,选择比较小的连接到head上去,如此往复。

#include "stdafx.h"
#include<iostream>
#include<queue>
using namespace std;

typedef struct node{
        int data;
        struct node *next;
}Node,*List;

List createList(int N,int multi)
{
	List head = (List)malloc(sizeof(Node));
	head->data = 0;
	head->next=NULL;
	int count = 0;
	List p = head;
	while(count<N)
	{	count++;
		List s = (List)malloc(sizeof(Node));
		s->data = count*multi;
		s->next = NULL;
		p->next = s;
		p = s;
	}
	return head;
}

void traverse(List head)
{
	if(head == NULL)
	{
		return;
	}
	List p = head->next;
	while(p)
	{
		cout<<p->data<<" ";
		p = p->next;
	}
	cout<<endl;
}

List unionList(List list1,List list2)
{
	if(list1 == NULL||list1->next==NULL)
		return list2;
	if(list2 == NULL||list1->next==NULL)
		return list1;


	list1 = list1->next;
	list2 = list2->next;
	List head = (List)malloc(sizeof(Node));
	List p = NULL;
	
	if(list1!=NULL && list2!=NULL)//初始化第一个节点
	{
		if(list1->data<=list2->data)
		{
			head->next = list1;
			list1 = list1->next;
		}else{
			head->next = list2;
			list2 = list2->next;
		}
	}
	p = head->next;
	while(list1!=NULL && list2!=NULL)//主体部分
	{
		if(list1->data<=list2->data)
		{
			p->next = list1;
			list1 = list1->next;
			p = p->next;
		}else{
			p->next = list2;
			list2 = list2->next;
			p = p->next;
		}
	}
	while(list1 != NULL)//如果list2已经完了,list1还有剩余
	{
		p->next = list1;
		list1 = list1->next;
		p = p->next;
	}
	while(list2 != NULL)//如果list1已经完了,list2还有剩余
	{
		p->next = list2;
		list2 = list2->next;
		p = p->next;
	}
	return head;
}

int main()
{
	int N = 10;
	List head1 = createList(N,1);
	List head2 = createList(N,2);
	traverse(head1);
	traverse(head2);
	List head = unionList(head1,head2);
	traverse(head);	
    getchar();
    return 0;
}


 

排序单链表、 并两个有序链表, 合并后依然有序

链表排序,链表的合并
  • My_heart_
  • My_heart_
  • 2016年06月02日 22:26
  • 810

如何将两个有序链表合并成一个有序链表。

有两个带头节点的有序链表,如何把他们合成一个有序链表?(假设链表带头节点) 我们通过取出其中一条链表的头节点作为合成后的有序链表的头节点(当然,这里也可以自己重新生成一个节点来作为头节点,但是使用原...
  • nitibu
  • nitibu
  • 2015年08月11日 17:22
  • 1714

算法题:合并两个有序的链表

题目:已知有两个有序的单链表,其头指针分别为head1和head2,实现将这两个链表合并的函数: Node* ListMerge(Node *head1,Node *head2) ...
  • JXH_123
  • JXH_123
  • 2014年08月04日 16:50
  • 16349

JavaScript对有序链表的合并

对于将两个有序链表合并为一个有序链表的问题,严蔚敏版的《数据结构》中用到了一种经典的算法。 1.使用两个指针,分别指向两条链表中当前待比较的节点,创建一条新链表,用于存放两条链表中的节点。 2.每...
  • esir82
  • esir82
  • 2017年03月13日 21:27
  • 638

实验2 不带头节点的单链表

实验1 编写函数slnklist delx(linklist head, datatype x),删除不带头结点单链表head中第一个值为x 的结点。 并构造测试用例进行测试。 #inclu...
  • wlxsq
  • wlxsq
  • 2015年12月24日 14:33
  • 5218

【剑指offer】链表相关-合并两个有序链表&递归写法17

#include #include #include //合并两个有序链表 struct ListNode { int m_nValue; ListNode * m_pNext; }; Lis...
  • panpan639944806
  • panpan639944806
  • 2014年03月04日 23:21
  • 1394

Java实现两个有序的单项链表的合并

无意中看到一道题,如下: 现有两个有序(升序)的单向链表,请编写程序将这两个链表合并成一个,并确保合并后的链表也是升序的 单向升序链表定义: public class ListNode {  int ...
  • liang_henry
  • liang_henry
  • 2016年10月27日 10:21
  • 3330

合并两个有序链表,让结果ren仍然有序

转载自: http://www.cnblogs.com/heyonggang/p/3405179.html   题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结...
  • tangaowen
  • tangaowen
  • 2016年06月06日 21:52
  • 984

两个有序单链表合并成一个有序单链表的java实现

两个有序单链表合并成一个有序单链表的java实现 -- 仅作为备注, 便于自己回顾....
  • kslinabc
  • kslinabc
  • 2016年10月20日 20:01
  • 1640

C++算法之 合并两个有序链表

题目:合并两个已经排序好的链表 方法1: 两个链表     比如链表1: 1->3->5->7->9    链表2:  2->4->6->8->10    跟我们合并两个数组一样,链表1的...
  • djb100316878
  • djb100316878
  • 2014年12月05日 11:39
  • 12140
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:笔试题四:带头节点head两个链表合并,并且有序
举报原因:
原因补充:

(最多只允许输入30个字)