面试题17:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增的排序的,如图中的链表1和链表2,则合并之后的升序链表3,结点的定义如下:
Struct ListNode
{
Int m_nvalue;
ListNode * m_pNext;
}
我的代码如下:
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
typedef struct Node
{
int data;//数据域
struct Node *next;//指向下一个节点的地址
}Node ,*List;//List == Node *
//单链表以NULL结尾
void InitList(List plist)
{
assert(plist != NULL);
if(plist == NULL)
{
return;
}
plist->next = NULL;
}
List BuyNode(int val)
{
Node *p = (Node *)malloc(sizeof(Node));
p->data = val;
//p->next = NULL;
return p;
}
//尾插
void Insert_Tail(List plist ,int val)//O(n)
{
Node *p;
for(p=plist; p->next!=NULL ;p=p->next)
{
;
}
Node *q = BuyNode(val);
//将q插入在p的后面
q->next = p->next;
p->next = q;
}
//从头到尾打印链表
void Show(List plist)
{
Node*p=plist->next;
for( ; p!= NULL ;p=p->next)
{
printf("%d ",p->data);
}
printf("\n");
}
Node * Marg(List plist1,List plist2)
{
Node *Head=plist1;
Node *p1=plist1;
Node *p2=plist2;
while(p1->next != NULL)
{
int i=0;
if(p2->data >= p1->data && p2->data<= p1->next->data)
{
Node*tmp1=p1->next->next;
Node*tmp2=p2->next->next;
p1->next=p2;
p2=tmp1;
p2=p2->next;
p1=p1->next;
}
else if(p2->data >=p1->data && p2->data>= p1->next->data)
{
p1=p1->next;
}
else if(p2->data < p1->data)
{
Node*tmp=p2->next->next;
p2->next=p1;
p2=p2->next;
if(i=0)
{
Head=plist2;
}
}
i++;
}
return Head;
}
int main()
{
Node plist1;
plist1.next=NULL;
Node plist2;
plist2.next=NULL;
for(int i=1; i<10; i=i+2)
{
Insert_Tail(&plist1 ,i);
}
for(int i=0; i<10; i=i+2)
{
Insert_Tail(&plist2 ,i);
}
Node *Head=Marg(&plist1,&plist2);
Show(Head);
// Show(&plist1);
return 0;
}