联发科笔试题编程部分

 

(1)实现链表的逆置

node *inverselinklist(node *head)

{
        node *p1,*p2,*p3;
        if(NULL==head||NULL==head->next) {
               return head;
        }
        p1=head;
        p2=p1->next;
        while (p2) {
               p3=p2->next;
               p2->next=p1;
               p1=p2;
               p2=p3;
        }
        head->next=NULL;
        head=p1;
        return head;
}


(2)用普通算法实现两个有序链表的合并

  

node *mergelinklist(node *head1,node *head2)
{
	node *p1,*p2,*temp=NULL,*cur=NULL,*head=NULL;
	p1=head1;
	p2=head2;
	while (p1!=NULL&&p2!=NULL) {

		if (p1->value<p2->value) {
			temp=p1;
			p1=p1->next;
		}
		else
		{	
			temp=p2;
			p2=p2->next;
		}
		if (NULL==head) {
			cur=temp;
			head=cur;
		}
		else
		{
			cur->next=temp;
			cur=temp;	
		}
	
	}
	temp=(p1?p1:p2);
	while (temp!=NULL) {
			cur->next=temp;
			cur=cur->next;
			temp=temp->next;
	}
	cur->next=NULL;
	return head;
}



(3)用递归算法实现两个有序列表的合并

node *mergeRecursion(node *head1,node *head2)
{
        if(NULL==head1)
        {
               return head2;
        }
        if(NULL==head2)
        {
               return head1;
        }
        node *head=NULL;
        if (head1->value<=head2->value) {
              head=head1;
              head->next=mergeRecursion(head1->next,head2);
        }
        else
        {
               head=head2;
               head->next=mergeRecursion(head1,head2->next);
        }              
        return head;
}



(4)判断单链表中是否存在环

bool IsExitsLoop(slist *head)
{
    slist *slow = head, *fast = head;
    while ( fast && fast->next ) 
    {
        slow = slow->next;
        fast = fast->next->next;
        if ( slow == fast ) break;
    }
    return !(fast == NULL || fast->next == NULL);
}



(5)二分查找法

int binSearch(int key,int length, int array[])
{
        int mid=0;
        int start = 0;
        int end = length - 1;
        while (start <= end) {
              mid = (end - start) / 2 + start;
              if (key == array[mid]) {
                     return mid;
              }
              if (key < array[mid]) {
                     end = mid - 1;
               } else if (key > array[mid]) {
                     start = mid + 1;
               } else {
                     return mid;
               }
        }
        return -1;
}


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值